﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IMModel.Domain.Common;
using System.Diagnostics.Contracts;

namespace IMModel.Domain
{
    internal static class CCache
    {
        /// <summary>
        /// Управление кэшированием
        /// </summary>
        /// <param name="caches">ссылка на кэш</param>
        /// <param name="сontext">контекст - ключ</param>
        /// <param name="calc">функция рассчёта - при создании новой кэшируемой коллекции</param>
        /// <returns>кэшируемая коллекция - результат рассчёта - новый или взятый из кэша</returns>
        public static RespondentIndexCollection Get(
            ref Dictionary<IndexContext, RespondentIndexCollection> caches,
            IndexContext сontext, Action<RespondentIndexCollection> calc)
        {
            return Get(ref caches, сontext, () =>
            {
                var ric = new RespondentIndexCollection();
                calc(ric);
                return ric;
            });
        }

        /// <summary>
        /// Управление кэшированием
        /// </summary>
        /// <param name="caches">ссылка на кэш</param>
        /// <param name="сontext">контекст - ключ</param>
        /// <param name="calc">функция создания новой кэшируемой коллекции</param>
        /// <returns>кэшируемая коллекция - результат рассчёта - новый или взятый из кэша</returns>
        public static RespondentIndexCollection Get(
            ref Dictionary<IndexContext, RespondentIndexCollection> caches,
            IndexContext сontext, Func<RespondentIndexCollection> get)
        {
            Contract.Requires(сontext != null);
            if (caches == null) caches = new Dictionary<IndexContext, RespondentIndexCollection>();
            else if (caches.ContainsKey(сontext)) return caches[сontext];

            var ric = get();
            caches.Add(сontext, ric);
            return ric;
        }
    }
}